package com.tear.language.node;

import java.util.HashMap;
import java.util.Map;

import net.sf.json.JSONObject;
import ognl.Ognl;

import org.apache.commons.lang.StringUtils;

import com.tear.language.utils.Attrs;
import com.tear.language.utils.TypeUtil;

/**
set赋值操作
set标签有必填属性name,value，非必填属性if,else，if表示当满足条件才赋值，如果if里面表达式是true
 那么就拿value里面的值赋值，如果是false就拿else里面的值赋值，如果else属性没有name就相当于是赋值null
赋值时先看局部变量里面有么有这个变量，如果有直接将参数放入局部变量，
*/
public class SetNode extends BaseNode {

	@Override
	public boolean parse(Map<String, Object> currParams,
			Map<String, Object> globalParams, JSONObject obj) throws Exception {
	
		String name = obj.optString(Attrs.NAME);
		String target = obj.optString(Attrs.TARGET);
//		String type = obj.optString(Attrs.TYPE);
//		String format = obj.optString(Attrs.FORMAT);
		Map<String, Object> allParams = getAllParams(currParams,globalParams);
		String valueStr = obj.optString(Attrs.VALUE);
		Object value = null;
		if(StringUtils.isNotEmpty(valueStr)) {
			valueStr = TypeUtil.replaceArray(valueStr);
			value = Ognl.getValue(valueStr,allParams);
		}
		if(value == null) {
			throw new Exception("set操作的变量("+name+")的值不存在");
		}
		String ifStr = obj.optString(Attrs.IF);
		boolean iif = true;
		if (StringUtils.isNotEmpty(ifStr)) {
			ifStr = TypeUtil.replaceArray(ifStr);
			iif = (Boolean) Ognl.getValue(ifStr, allParams);
			if (!iif) {
				String elseStr = obj.optString(Attrs.ELSE);
				if (StringUtils.isNotEmpty(elseStr)) {
					Object value1 = Ognl.getValue(elseStr, allParams);
					value = value1;
				}
			}
		}
		// 如果局部变量存在则更新局部变量（如果全局变量中也存在，那么全局变量被局部变量遮蔽了），反之更新全局变量
		try {
			//如果target没有值就直接关注顶层变量
			if(StringUtils.isEmpty(target)) {
				if (currParams.containsKey(name)) {
					currParams.put(name, value);
				} else {
					globalParams.put(name, value);
				}
			} else { //如果target有值，则关注顶层变量中的target代表的变量
				Object obj1 = new HashMap<String,Object>();
				if (currParams.containsKey(target)) {
					obj1 = currParams.get(target);
				} else if(globalParams.containsKey(target)){
					obj1 = globalParams.get(target);
				}
				if(obj1 instanceof Map) {
					Map map = (Map)obj1;
					map.put(name, value);
				} else {
					throw new Exception("add指令的"+target+"参数不是对象不能设置值");
				}
			}
			
		} catch (Exception e) {
			String msg = "";
			if(target != null) {
				msg = "往"+target+"变量中设置参数("+name+")出错"+e.getMessage();
			} else {
				msg = "设置参数("+name+")出错"+e.getMessage();
			}
			throw new Exception(msg);
		}
		
		return true;
		
	}
}
